package com.gs.business.backup;

import java.io.FileOutputStream;
import java.util.AbstractList;
import java.util.ArrayList;
import java.util.Vector;

import android.os.Bundle;

import com.gs.R;
import com.gs.business.cache.CacheCategorie;
import com.gs.business.cache.CacheEntrate;
import com.gs.business.cache.CacheGruppi;
import com.gs.business.cache.CacheUscite;
import com.gs.business.cache.CacheUtenti;
import com.gs.domain.CatSpese;
import com.gs.domain.Entrate;
import com.gs.domain.Gruppi;
import com.gs.domain.SingleSpesa;
import com.gs.domain.Utenti;
import comi.gsi.command.javabeancommand.AbstractOggettoEntita;
import comi.gsi.view.MyBaseActivity;

public class SaveBackup extends MyBaseActivity {

	public static final String SEP = "#";
	public static final String SEP_RIGA = "§";
	public static final String CAPO_RIGA = "";

	@Override
	protected int getIdLayout() {
		return R.layout.admin;
	}

	@Override
	protected void myOnCreate(final Bundle savedInstanceState) {
		try {
			creaBackup();
		} catch (Exception e) {
			e.printStackTrace();
		}

	}

	public boolean creaBackup() throws Exception {

		final Vector<Gruppi> allGruppi = CacheGruppi.getSingleton().getVettoreGruppi();
		final FileOutputStream fileGruppi = openFileOutput(getNomeFile(Gruppi.NOME_TABELLA), MODE_WORLD_WRITEABLE);
		scriviFile(allGruppi, fileGruppi);

		final Vector<CatSpese> allCategorie = CacheCategorie.getSingleton().getVettoreCategorie();
		final FileOutputStream fileCategorie = openFileOutput(getNomeFile(CatSpese.NOME_TABELLA), MODE_WORLD_WRITEABLE);
		scriviFile(allCategorie, fileCategorie);

		final Vector<Utenti> allUtenti = CacheUtenti.getSingleton().getVettoreUtenti();
		final FileOutputStream fileUtenti = openFileOutput(getNomeFile(Utenti.NOME_TABELLA), MODE_WORLD_WRITEABLE);
		scriviFile(allUtenti, fileUtenti);

		final ArrayList<SingleSpesa> allUsciteForUtente = CacheUscite.getSingleton().getAllUsciteForUtente();
		final FileOutputStream fileUscite = openFileOutput(getNomeFile(SingleSpesa.NOME_TABELLA), MODE_WORLD_WRITEABLE);
		scriviFile(allUsciteForUtente, fileUscite);

		final ArrayList<Entrate> allEntrateForUtente = CacheEntrate.getSingleton().getAllEntrateForUtente();
		final FileOutputStream fileEntrate = openFileOutput(getNomeFile(Entrate.NOME_TABELLA), MODE_WORLD_WRITEABLE);
		scriviFile(allEntrateForUtente, fileEntrate);

		return false;

	}

	public static String getNomeFile(final String nome) {
		return nome + ".txt";
	}

	private void scriviFile(@SuppressWarnings("rawtypes") final AbstractList allEntities, final FileOutputStream file) throws Exception {
		String stringaTotale = "";
		for (Object element : allEntities) {
			final AbstractOggettoEntita abstractOggettoEntita = (AbstractOggettoEntita) element;
			final String toSave = getStringaEntita(abstractOggettoEntita) + CAPO_RIGA;
			stringaTotale += toSave;
		}
		file.write(stringaTotale.getBytes());
		file.close();
	}

	private String getStringaEntita(final AbstractOggettoEntita abstractOggettoEntita) {
		if (abstractOggettoEntita != null) {
			if (abstractOggettoEntita instanceof Gruppi) {
				return getStringaGruppi(abstractOggettoEntita);
			} else if (abstractOggettoEntita instanceof Entrate) {
				return getStringaEntrate(abstractOggettoEntita);
			} else if (abstractOggettoEntita instanceof SingleSpesa) {
				return getStringaUscite(abstractOggettoEntita);
			} else if (abstractOggettoEntita instanceof Utenti) {
				return getStringaUtenti(abstractOggettoEntita);
			}else if (abstractOggettoEntita instanceof CatSpese) {
				return getStringaCategorie(abstractOggettoEntita);
			}
		}
		return null;
	}

	private String getStringaCategorie(final AbstractOggettoEntita abstractOggettoEntita) {
		final CatSpese cat = (CatSpese) abstractOggettoEntita;
		final String idCategoria = Integer.toString(cat.getidCategoria());
		final String idGruppo = cat.getGruppi() != null ? Integer.toString(cat.getGruppi().getidGruppo()) : null;
		return idCategoria + SEP + cat.getNomeEntita() + SEP + cat.getdescrizione() + SEP + idGruppo + SEP + cat.getimportanza() + SEP_RIGA;
	}

	private String getStringaGruppi(final AbstractOggettoEntita abstractOggettoEntita) {
		final Gruppi gruppo = (Gruppi) abstractOggettoEntita;
		return gruppo.getidGruppo() + SEP + gruppo.getNomeEntita() + SEP + gruppo.getdescrizione() + SEP_RIGA;
	}

	private String getStringaUtenti(final AbstractOggettoEntita abstractOggettoEntita) {
		final Utenti utenti = (Utenti) abstractOggettoEntita;
		return utenti.getidUtente() + SEP + utenti.getNomeEntita() + SEP + utenti.getCognome() + SEP + utenti.getusername() + SEP + utenti.getpassword() + SEP_RIGA;
	}

	private String getStringaUscite(final AbstractOggettoEntita abstractOggettoEntita) {
		final SingleSpesa uscita = (SingleSpesa) abstractOggettoEntita;
		final String idCategoria = uscita.getCatSpese() != null ? Integer.toString(uscita.getCatSpese().getidCategoria()) : null;
		final String idUtente = uscita.getUtenti() != null ? Integer.toString(uscita.getUtenti().getidUtente()) : null;
		return uscita.getidSpesa() + SEP + uscita.getNomeEntita() + SEP + uscita.getdescrizione() + SEP + uscita.getData() + SEP + uscita.getDataIns() + SEP + uscita.getinEuro() + SEP + idUtente
				+ SEP + idCategoria + SEP_RIGA;
	}

	private String getStringaEntrate(final AbstractOggettoEntita abstractOggettoEntita) {
		final Entrate entrate = (Entrate) abstractOggettoEntita;
		final String idUtente = entrate.getUtenti() != null ? Integer.toString(entrate.getUtenti().getidUtente()) : null;
		return entrate.getidEntrate() + SEP + entrate.getNomeEntita() + SEP + entrate.getdescrizione() + SEP + entrate.getdata() + SEP + entrate.getDataIns() + SEP + entrate.getFisseoVar() + SEP
				+ entrate.getinEuro() + SEP + idUtente + SEP_RIGA;

	}
}
